package excel

import (
	"errors"
	"io/ioutil"
	"net/http"
	"os"
	"strconv"
	"strings"
	"time"

	"gitee.com/wzqj/frame/tools/https"
)

const (
	test = "http://qnc.qjnice.com/1593488087.xlsx"
)

//下载excel文件资源到本地
//@p 本地地址
//@u 下载链接
//返回文件完整路径,文件长度长度和错误,文件名为时间搓
func DownloadExcel(p, u string) (string, error) {

	//创建文件夹,如果存在不会覆盖
	err := os.MkdirAll(p, 0766)
	if err != nil {
		return null, errors.New("方法os.MkdirAll错误:" + err.Error())
	}

	//fileBytes := []byte{}
	//if err := https.New(u).Res(&fileBytes).Debug().Get(); err != nil {
	//	return null, err
	//}
	reqest, err := http.NewRequest("GET", u, nil)
	if err != nil {
		return null, err
	}
	res, err := https.NewClient().Do(reqest)

	////读取网上文件,获取body
	//res, err := http.Get(u)
	if err != nil {
		return null, errors.New("方法http.Get错误:" + err.Error())
	}
	defer res.Body.Close()

	//把body转为[]byte
	fileBytes, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return null, errors.New("方法ioutil.ReadAll错误:" + err.Error())
	}

	//判断文件是否为空
	if len(fileBytes) == 0 {
		return null, errors.New("文件为空")
	}

	//文件名,用时间戳来命名
	name := strconv.Itoa(int(time.Now().Unix())) + ".xlsx" //这样命名会全部保存
	//name := "import.xlsx"//这样命名会覆盖保存

	// 检查文件类型，detectcontenttype只需要前512字节
	filetype := http.DetectContentType(fileBytes)
	if filetype != "application/zip" {
		return null, errors.New("文件类型错误" + filetype + ",需要\"application/zip\"")
	}

	//文件完整路径
	path := p + "/" + name

	//保存文件,新建文件
	file, err := os.Create(path)
	if err != nil {
		return null, errors.New("方法os.Create错误:" + err.Error())
	}
	defer file.Close()

	//把[]byte全部写入新文件
	num, err := file.Write(fileBytes)
	if err != nil {
		return null, errors.New("方法file.Write错误:" + err.Error())
	}

	//判断文件读取是否丢失
	if len(fileBytes) != num {
		return null, errors.New("文件损坏")
	}

	return path, nil
}

//下载文件
func DownFile(filePath, downUrl string) (string, error) {
	fileName := getFileName(downUrl) //文件名称
	//创建文件夹
	err := os.MkdirAll(filePath, 0766)
	if err != nil {
		return null, errors.New("方法os.MkdirAll错误:" + err.Error())
	}
	fullPath := filePath + fileName //完整路径

	//保存文件,新建文件
	file, err := os.Create(fullPath)
	if err != nil {
		return null, errors.New("方法os.Create错误:" + err.Error())
	}
	defer file.Close()

	fileBytes := []byte{}
	if err := https.New(downUrl).Res(&fileBytes).Get(); err != nil {
		return null, err
	}

	//把[]byte全部写入新文件
	num, err := file.Write(fileBytes)
	if err != nil {
		return null, errors.New("方法file.Write错误:" + err.Error())
	}

	//判断文件读取是否丢失
	if len(fileBytes) != num {
		return null, errors.New("文件损坏")
	}

	return fullPath, nil
}

//根据连接提取文件名称
func getFileName(downUrl string) string {
	if n := strings.LastIndex(downUrl, "/"); n > 0 {
		return downUrl[n+1:]
	}
	return ""
}
